package com.syx.client.service;

import com.syx.common.Message;
import com.syx.common.MessageType;
import com.syx.common.User;

import java.awt.*;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * @author 邵一鑫
 * @date 2024/1/13 21:12
 * 该类用于完成用户登录、拉取在线用户等用户相关的功能
 */
public class UserClientService {

    private User user = null;

    private Socket socket = null;

    /**
     * 验证用户登录
     * @param userId 用户id
     * @param pwd 密码
     * @return 是否成功
     */
    public boolean checkUser(String userId, String pwd) {
        // 创建 user 对象
        user = new User(userId, pwd);

        boolean flag = false;   // 标识登录是否成功

        try {
            // 连接到服务器
            socket = new Socket(InetAddress.getByName("127.0.0.1"), 8010);
            // 得到 ObjectOutputStream
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            // 发送
            oos.writeObject(user);
//            socket.shutdownOutput();
            // 得到 ObjectInputStream
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            // 读取服务端返回的 message
            Message msg = (Message)ois.readObject();
            if (msg.getMesType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)) {
                // 登陆成功，创建线程保持连接
                ClientConnectServerThread clientConnectServerThread = new ClientConnectServerThread(socket);
                clientConnectServerThread.start();
                // 集合管理线程
                ManageConnectServerThread.addClientConnectServerThread(userId, clientConnectServerThread);
                flag = true;
            } else {
                // 登录失败，关闭socket
                socket.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            return flag;
        }
    }

    /**
     * 向服务端请求在线用户列表
     */
    public void getOnlineFriendList() {
        Message message = new Message(MessageType.MESSAGE_GET_ONLINE_FRIEND);
        // 发送给服务端
        try {
            // 得到当前线程的socket对应的ObjectOutputStream
            ObjectOutputStream oos =
                    new ObjectOutputStream(
                            ManageConnectServerThread.getClientConnectServerThread(user.getUserId()).getSocket().getOutputStream());
            // 写入
            oos.writeObject(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 退出系统
     */
    public void logout() {
        Message message = new Message();
        // 设置需要关闭的对象
        message.setFromUser(user.getUserId());
        // 设置客户端退出
        message.setMesType(MessageType.MESSAGE_CLIENT_EXIT);
        try {
            // 发送
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(message);
            // 退出
            System.exit(0); // 结束线程
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
